package br.com.ericogr.hanoi.database.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import br.com.ericogr.hanoi.database.DatabaseHelper;
import br.com.ericogr.hanoi.database.Pontuacao;

public class PontuacaoDaoImpl implements PontuacaoDao {
    private DatabaseHelper mDatabaseHelper;
    private static final String TABELA = "pontuacao";

    public PontuacaoDaoImpl(Context context) {
        mDatabaseHelper = new DatabaseHelper(context);
    }

    @Override
    public long inserirAtualizar(Pontuacao objeto) {
        SQLiteDatabase db = null;

        try {
            db = mDatabaseHelper.getWritableDatabase();
            ContentValues cv = new ContentValues();

            cv.put("pratos", objeto.getPratos());
            cv.put("movimentos", objeto.getMovimentos());
            cv.put("tempo", objeto.getTempo());
            cv.put("data", objeto.getData().getTime());

            if (objeto.getId() == null) {
                long id = db.insert(TABELA, null, cv);

                objeto.setId(id);

                return id;
            } else {
                return db.update(TABELA, cv, "_id = " + objeto.getId(), null);
            }
        } finally {
            if (db != null) {
                db.close();
            }
        }
    }

    @Override
    public Pontuacao getPontuacaPorPrato(int quantidadeDePratos) {
        SQLiteDatabase db = null;
        Cursor c = null;

        try {
            Pontuacao pontuacao;
            db = mDatabaseHelper.getReadableDatabase();

            c = db.query(TABELA, new String[] { "_id", "pratos", "movimentos",
                    "tempo", "data" }, "pratos = ?",
                    new String[] { Integer.toString(quantidadeDePratos) },
                    null, null, null, "1");

            if (!c.moveToFirst()) {
                return null;
            }

            pontuacao = new Pontuacao();

            pontuacao.setId(c.getLong(0));
            pontuacao.setPratos(c.getInt(1));
            pontuacao.setMovimentos(c.getInt(2));
            pontuacao.setTempo(c.getInt(3));
            pontuacao.setData(new Date(c.getLong(4)));

            return pontuacao;
        } finally {

            if (c != null) {
                c.close();
            }

            if (db != null) {
                db.close();
            }
        }
    }

    @Override
    public List<Map<String, Object>> getMapaTodasAsPontuacoes() {
        SQLiteDatabase db = null;
        Cursor c = null;
        List<Map<String, Object>> pontuacoes = new ArrayList<Map<String, Object>>();

        try {
            db = mDatabaseHelper.getReadableDatabase();

            c = db.query(TABELA, new String[] { "_id", "pratos", "movimentos", "tempo", "data" },
                    null, null, null, null, "pratos");

            if (c.moveToFirst()) {
                while(!c.isAfterLast()) {
                    Map<String, Object> reg = new HashMap<String, Object>();
                    
                    reg.put("_id", c.getLong(0));
                    reg.put("pratos", c.getInt(1));
                    reg.put("movimentos", c.getInt(2));
                    reg.put("tempo", c.getInt(3));
                    reg.put("data", c.getLong(4));
                    
                    pontuacoes.add(reg);
                    
                    c.moveToNext();
                }
            }
            
            return pontuacoes;
        } finally {

            if (c != null) {
                c.close();
            }

            if (db != null) {
                db.close();
            }
        }
    }
}
